package 反射;

import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 调用运行类中指定的结构：属性、方法、控制器
 */
public class Reflection {
    @Test
    public void test(){
        try {
            Class clazz=Emp.class;
            //1.创建运行时类的对象
            Emp o = (Emp)clazz.newInstance();
            //2.获取运行时类的对象的【属性】
            Field age = clazz.getDeclaredField("age");
            //3.保证属性可访问
            age.setAccessible(true);
            //4.设置属性值
            age.set(o,100);
            System.out.println(age.get(o));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Test
    public void test1() {
        try {
            Class clazz=Emp.class;
            //1.创建运行时类的对象
            Emp o = (Emp)clazz.newInstance();
            //2.获取运行时类的对象的【方法】
            Method getGender = clazz.getDeclaredMethod("getGender1",String.class);
            //3.保证属性可访问
            getGender.setAccessible(true);
            //4.调用方法，可以接收返回值
            getGender.invoke(o, "wow");
            ////////////////////////////////////////////////
            //5.调用静态方法,无参数
            Method getGender1 = clazz.getDeclaredMethod("getGender2");
            getGender1.setAccessible(true);
            getGender1.invoke(Emp.class);//写什么都可以调用静态方法
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Test
    public void test2() {
        try {
            Class clazz=Emp.class;
            //2.获取指明参数运行时类的对象的【构造器】
            Constructor constructor = clazz.getConstructor(String.class);
            //3.保证属性可访问
            constructor.setAccessible(true);
            //4.调用方法，可以接收返回值
            Emp wow = (Emp) constructor.newInstance( "wow");
            System.out.println(wow);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
